# -*- coding: utf-8 -*-

import Env.env_config as cfg
from celery.schedules import crontab
from datetime import timedelta


# 保存 测试任务
BROKER_URL = f'redis://{cfg.REDIS_ADDR}/1'

# 保存 测试结果
CELERY_RESULT_BACKEND = f'redis://{cfg.REDIS_ADDR}/2'

# 指定导入的任务模块（ .py 文件 ）
CELERY_IMPORTS = ('Celery_program.celery_task')

##############################################################

# 任务接受的内容 序列化类型
CELERY_ACCEPT_CONTENT = ['json']

# 任务序列化方式
CELERY_TASK_SERIALIZER = 'json'

# queue 镜像的备份策略，如果是'all'，则在所有 RabbitMQ 节点都备份 queue 镜像，也可以设置为节点名称列表
CELERY_QUEUE_HA_POLICY = 'all'

# 任务发送完成是否需要确认（ 若celery服务挂了，未完成的任务会重新进入队列 ）
CELERY_ACKS_LATE = True

# 结果持久化 （ 若redis服务重启了，其result仍然保留着 ）
CELERY_RESULT_PERSISTENT = True

# celery work 每次去redis预取任务的数量
CELERYD_PREFETCH_MULTIPLIER = 1

# 并发worker数
CELERYD_CONCURRENCY = 4

# 执行任务结果序列化方式
CELERY_RESULT_SERIALIZER = 'json'

# 指定时区，默认是 UTC
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = True

# 单任务超时时间设置(强制杀掉worker,但不会报错误信息)
# CELERYD_TASK_TIME_LIMIT = 300
# 单任务超时时间设置(会有杀不掉的worker,会有报错误信息)
# CELERYD_TASK_SOFT_TIME_LIMIT = 300


CELERYBEAT_SCHEDULE = {
    'add-every-30-seconds': {
         'task': 'celery_app.task1.add',
         'schedule': timedelta(seconds=30),       # 每 30 秒 执行一次
         'args': (5, 8)                           # 任务函数参数
    },
    'multiply-at-some-time': {
        'task': 'abc',
        'schedule': crontab(hour=9, minute=50),    # 每天早上 9 点 50 分执行一次
        'schedule': crontab(minute="*/1"),          # 每 分 钟 执行一次
        'schedule': crontab(minute=0, hour="*/1"),  # 每 小 时 执行一次
        'args': (3, 7)                              # 任务函数参数
    }
}

